/*
 * Task_Meter.cpp
 *
 *  Created on: 2018-3-31
 *      Author: root
 */

#include "Task_Meter.h"
#include "tools.h"
#include <pthread.h>
#include "app_debug.h"
#include <sys/msg.h>
#include <stdlib.h>
#include "sys.h"
#include "protocol_meter.h"
#include "meter.h"
#include <unistd.h>
#include <string.h>
#include "Task_Timer.h"
//TTaskInfo Info_Task_Meter[2];
TTaskInfo Info_Task_Meter_out[4];
TTaskInfo Info_Task_Meter_in;
u8 our_portid[]={0,1,2,3};
//
//OS_TaskRet Task_Meter1(void* arg)//复制电表表号没有抄到表 抄表结果 电量
//{
//	u8 flag_mtaddr=0;
//	u8 ret;
//	u8 gunid=1;
//	u8 num_err=0;
//	u8 port1;
//	uart_meter *pmeter=(uart_meter*)arg;
//	char mt_addr[6]={0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
////	u8 gunnum=1;
//	notRead_Num[gunid]=0;
//     debug_meter_mt("电表任务开始执行！！！！！！！！！！！pmeter->comno=%d",pmeter->comno);
//     sleep(1);
//     Uart_Meter_Init(pmeter);
//   while(1)
//   {
//	  if( flag_mtaddr==0)
//	  {
//		                ret=getMtAddr(&mt_addr[0],pmeter);
//		                if(ret==0)
//		                {
//		              	   flag_mtaddr=1;
//		                }
//		                else
//		                	flag_mtaddr=0;
//
//	  }
//      if(flag_mtaddr==1)
//      {
//
//    	  port1=1;
//    	  gunid=1;
//	      ReadMeterData(port1,gunid, 0, &mt_addr[0],pmeter);
//	   //    ReadMeterData(gunnum,&mt_addr[0],pmeter);
//      }
//      else
//      {
//    	  num_err++;
//    //      printf("枪号%d抄取电表地址失败 次数=%d！！！！",gunid,num_err);
//          if(num_err>=5)
//          {
//      //  	  printf("枪号%d报告主控电表地址失败=%d！！！！",gunid,num_err);
//        	  num_err=1;
//        	  pmeter->sendErr(1,1);//0xfe,0xfe,0xfe,0xfe,
//          }
//    	  sleep(2);
//      }
//   }
//	return NULL;
//}
//OS_TaskRet Task_Meter(void* arg)//复制电表表号int getMtAddr(char* addr,uart_meter *gp_mt);
//{
//	u8 flag_mtaddr=0;
//	u8 ret;
//	u8 gunid=0;
//	u8 num_err=0;
//	uart_meter *pmeter=(uart_meter*)arg;
//	u8 port1;
//	u8 i = 0;
//	char mt_addr[2][6]={{0xaa,0xaa,0xaa,0xaa,0xaa,0xaa},{0xaa,0xaa,0xaa,0xaa,0xaa,0xaa}};
//
//	u8 gunnum=pmeter->meternum;
//	notRead_Num[gunid]=0;
//    debug_meter_mt("电表任务开始执行！！！！！！！！！！！pmeter->comno=%d",pmeter->comno);
//     sleep(1);
//     Uart_Meter_Init(pmeter);
//   while(1)
//   {
//	  if( flag_mtaddr==0)
//	  {
//		  	   if(gunnum==1)
//		  	   {
//		                ret=getMtAddr(&mt_addr[0][0],pmeter);
//		                if(ret==0)
//		                {
//		              	   flag_mtaddr=1;
//		                }
//		                else
//		                	flag_mtaddr=0;
//		  	   }
//		  	   else
//		  	   {
//	              	  flag_mtaddr=1;
//	              	debug_meter_mt("复制电表表号！！！！！！\r\n  mt1=%.*a  mt2=%.*a ",6,pmeter->addr[0],6,pmeter->addr[1]);
//
////
////	              	  for(i=0;i<6;i++)
////	              	  {
////	              		  mt_addr[0][i]=pmeter->addr[0][5-i];
////	              		  mt_addr[1][i]=pmeter->addr[1][5-i];
////
////	              	  }
////
////	              	  memcpy(&mt_addr[0][0],&pmeter->addr[0][0],6);
////	              	  memcpy(&mt_addr[1][0],&pmeter->addr[1][0],6);
//
//		              	debug_meter_mt("111复制电表表号！！！！！！\r\n  mt1=%.*a  mt2=%.*a ",6,&mt_addr[0][0],6,&mt_addr[1][0]);
//		  	   }
//	  }
//
//
//      if(flag_mtaddr==1)
//      {
//    	  printf("表地址已经抄到，开始抄表！！\r\n");
//    		u8 gunid;
//    		 if(pmeter->comno==3)
//    		 {
//    			 port1=0;
//
//    		 }
//    		 else
//    		 {
//    			 port1=1;
//    		 }
//
//     		for (i = 0; i <gunnum ; i++) {
//
//
//    			if(gunnum==2)
//    			{
//    			    gunid=i; //块表 抄表包
//    			}
//    			else if(gunnum==1)
//    			{
//
//    				gunid=port1;
//    			}
//
//    			ReadMeterData(port1,gunid, i, &mt_addr[i][0],pmeter);
//
//
//     		}
//      }
//      else
//      {
//    	  num_err++;
//     //     printf("枪号%d抄取电表地址失败 次数=%d！！！！\r\n",gunid,num_err);//处'理第
//          if(num_err>=5)
//          {
//       // 	  printf("枪号%d报告主控电表地址失败=%d！！！！\r\n",gunid,num_err);
//        	  num_err=1;
//        	  pmeter->sendErr(0,1);//0xfe,0xfe,0xfe,0xfe,
//          }
//    	  sleep(1);
//      }
//   }
//	return NULL;
//}
OS_TaskRet Task_Meter_in(void* arg)
{
	u8 portid = *(u8*) arg;
	u8 flag_mtaddr = 0;
	u8 num_err=0;

	printf("输入电表的端口号 =%d \"n",portid);
	Uart_Meter_Init(portid,gp_mt.in_baud);
	int ret;
	char mt_addr[6] = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
	notRead_Num[METER_IN] = 0;
	//sleep(4);
	while (1) {
		if (flag_mtaddr == 0) {

			ret = getMtAddr(portid,METER_IN,  &mt_addr[0]);
			if (ret == 0) {
				flag_mtaddr = 1;
			} else
				flag_mtaddr = 0;

		}
		if (flag_mtaddr == 1) {

			ReadMeterData(portid, METER_IN, &mt_addr[0],gp_mt.in_phase_num,1);//gp_mt.phase_num
			//    ReadMeterData(gunnum,&mt_addr[0],pmeter);
		} else {
			num_err++;
			//      printf("枪号%d抄取电表地址失败 次数=%d！！！！",gunid,num_err);
			if (num_err >= 5) {
				//  	  printf("枪号%d报告主控电表地址失败=%d！！！！",gunid,num_err);
				num_err = 1;
				gp_mt.sendErr(METER_IN, 1); //0xfe,0xfe,0xfe,0xfe,
			}
			sleep(2);
		}

	}
	return NULL;
}
OS_TaskRet Task_Meter_out(void* arg)
{
	u8 portid = *(u8*) arg;
	u8 gunnum=0;
	int i=0,j;
	char mt_addr[4][6];
	int ct[4];
	u8 phase_num[]={1,1,1,1};
	u8 gunid[]={0,0,0,0};
	u8 gunid_tem=0;
	int ret;

	u8 flag_mtaddr = 0;
	u8 num_err=0;
	Uart_Meter_Init(portid,gp_mt.out_baud);

	for(i=0;i<gp_mt.meternum;i++)
	{

		//debug_meter_mt("端口%d gp_mt.pmeter_para[i].portid=%d  枪号=%d  第%d块表",portid,gp_mt.pmeter_para[i].portid,i,gunnum+1);
		if(gp_mt.pmeter_para[i].portid==(portid+1) )
		{

		    debug_meter_mt("xxxxxxxxxxxx端口%d gp_mt.pmeter_para[i].portid=%d  枪号=%d  第%d块表",portid,gp_mt.pmeter_para[i].portid,i,gunnum+1);
			for(j=0;j<6;j++)
				mt_addr[gunnum][j]=gp_mt.pmeter_para[i].meteraddr[5-j];//gp_mt.pmeter_para[i].meteraddr[j];//
            ct[gunnum]=gp_mt.pmeter_para[i].ct;
			if(gp_mt.devtype==AC)
			{
				phase_num[gunnum] =gp_mt.pmeter_para[portid].phase_num;
			}
			else
				phase_num[gunnum] = 1;
			gunid[gunnum]=i;
			gunnum++;


		}
		if(gunnum>=3)
			break;

	}

	if(gunnum==0 && i== gp_mt.meternum)
	{
	   while(1)
	   {
		   sleep(1);
	   }
	}

    for(i=0;i<gunnum;i++)
    {
    	printf("端口portid=%d 共有gunnum=%d个枪 第%d个枪 枪号=%d\n",portid,gunnum,i,gunid[i]);

		gunid_tem=gunid[i];
		debug_meter_mt("表地址=%.*a",6,&mt_addr[i][0]);

    }
    if(gunnum>1)
    {
    	flag_mtaddr=1;
         printf("本端口%d有多个枪，不抄取地址，直接抄表 gunnum=%d\n",portid,gunnum);
    }

    else
    {
    	flag_mtaddr=0;
    }

		while (1) {

			if (flag_mtaddr == 0) {
				printf("只有一个枪，抄取地址 port=%d  gunid=%d\n",portid,gunid[0]);
				ret = getMtAddr(portid, gunid[0], &mt_addr[0][0]);
				if (ret == 0) {
					flag_mtaddr = 1;
				} else
					flag_mtaddr = 0;

			}


		if (flag_mtaddr == 1) {

			for(i=0;i<gunnum;i++)
			{
				gunid_tem=gunid[i];
				printf("开始抄读端口port=%d的第%d表，枪号=%d\n",portid,i,gunid_tem);
				ReadMeterData(portid, gunid_tem, &mt_addr[i][0],phase_num[i],ct[i]);
				sleep(1);
			}

		} else {
			num_err++;
			      printf("枪号%d抄取电表地址失败 次数=%d！！！！",gunid[0],num_err);
			if (num_err >= 5) {
				  	  printf("枪号%d报告主控电表地址失败=%d！！！！",gunid[0],num_err);
				num_err = 1;
				gp_mt.sendErr(gunid[gunnum], 1); //0xfe,0xfe,0xfe,0xfe,
			}
			sleep(2);
		}



	}
	return NULL;
}
void initTaskMeter( void *pmeter)//netcom_data
{

	int i,k;
	u8 portnum=0;
	u8 exitportid[]={0xff,0xff,0xff,0xff};
	u8 portid;
	memcpy((u8*)&gp_mt,(u8*)pmeter,sizeof(uart_meter));
	printf("new电表任务初始化！！！！！！！！！！枪的个数=%d  gp_mt.portnum=%d\n",gp_mt.meternum,gp_mt.portnum);


	for(i=0;i<gp_mt.meternum;i++)
	{
		portid=gp_mt.pmeter_para[i].portid;

		printf("第%d个枪的端口号=%d\n",i,portid);
		if(portid>0 && portid<=gp_mt.portnum)
		{
			printf("设置需要使用的端口号=%d\n",portid);
			exitportid[portid-1]=1;
		}


	}

	for(k=0;k<gp_mt.portnum;k++)
	{
         printf("exitportid[k]=%d  k=%d\n",exitportid[k],k);
	}
	for(k=0;k<gp_mt.portnum;k++)
	{
         printf("exitportid[k]=%d\n",exitportid[k]);
		if(exitportid[k]==1)
		{
			printf("需要初始化的485端口our_portid[k]=%d  k=%d  portid=%d\n ",our_portid[k],k,portid);
			portnum++;
			debug_meter_mt("电表任务初始化  k=%d！！！！！！！！！！",k);
			Info_Task_Meter_out[k].Prio = DEFAULT_PRIO + 3 + k;
			Info_Task_Meter_out[k].Stk_Size = 0;
			Info_Task_Meter_out[k].Stk = NULL;
			os_create_task(Task_Meter_out, (void*) &our_portid[k],
					&Info_Task_Meter_out[k]);
		//	sleep(4);//&portid[gp_mt.portnum-1]
		}
		else
			printf("没有使用的485端口%d %d  \n",k,our_portid[k]);


	}





//	if (portnum < gp_mt.portnum) {
//		printf("输入交流电表任务初始化  portnum=%d  端口个数=%d！！！！！！！！！！\n",portnum,gp_mt.portnum);
//		Info_Task_Meter_in.Prio = DEFAULT_PRIO + 2 + gp_mt.portnum;
//		Info_Task_Meter_in.Stk_Size = 0;
//		Info_Task_Meter_in.Stk = NULL;
//		os_create_task(Task_Meter_in, (void*) &our_portid[gp_mt.portnum - 1],
//				&Info_Task_Meter_in);
//	}
//	sleep(1);//&portid[gp_mt.portnum-1]



}
